from itertools import groupby
from pydoc import describe
from collections import Counter
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics
from sklearn.tree import plot_tree
import numpy as np
import pandas as pd
from matplotlib import cm
from wordcloud import STOPWORDS
import dataCleaning as dataCleaning
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score






# 设置显示所有行和列
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
boss_fp = pd.read_csv('../data/boss_data.csv')
boss_fp['salary'] = boss_fp['salary_desc'].apply(dataCleaning.normalize_salary)
boss_fp['jobCategory'] = boss_fp['job_name'].apply(lambda x: dataCleaning.classify_job(x, dataCleaning.job_keywords))
boss_fp['min_salary'] = boss_fp['salary'].apply(dataCleaning.extract_min_salary)
boss_fp['max_salary'] = boss_fp['salary'].apply(dataCleaning.extract_max_salary)

boss_fp = boss_fp[boss_fp['jobCategory'].str.contains('Python', case=False, na=False)]

boss_fp['job_experience'] = boss_fp['job_experience'].fillna('经验不限')
boss_fp.drop_duplicates(inplace=True)

print(len(boss_fp))

# print(boss_fp[['job_name','salary_desc','city_name','brand_name','brand_industry','brand_scale_name','job_experience','job_degree','welfare_list']].isnull().sum())

# 使用找到的支持中文的字体
plt.rcParams['font.family'] = ['STHeiti']  # 或者使用你系统中可用的中文字体


# 1.获取招聘岗位数量分析 按地区。
# plt.figure(figsize=(14, 6))  # 设置图形宽度为 10 英寸，高度为 6 英寸
# city_counts = boss_fp['city_name'].value_counts()
# # 转换为 categories 和 values
# categories = list(city_counts.index)  # 提取索引作为类别
# values = city_counts.tolist()  # 转换 Series 数据为列表
# plt.bar(categories, values)
# # 添加标题和标签
# plt.title("各城市招聘数量")
# plt.xlabel("")
# plt.ylabel("数量")
# plt.show()

# 2.每个行业找人数量
# plt.figure(figsize=(14, 6))  # 设置图形宽度为 10 英寸，高度为 6 英寸
# df_expanded = boss_fp.explode('brand_industry')
# count_result = df_expanded.groupby('brand_industry').count()['id']
# # 对结果进行降序排序
# sorted_result = count_result.sort_values(ascending=False).head(10)
# # 转换为 categories 和 values
# categories = list(sorted_result.index)  # 提取索引作为类别
# values = sorted_result.tolist()  # 转换 Series 数据为列表
# plt.bar(categories, values)
# # 添加标题和标签
# plt.title("各行业招聘数量")
# plt.xlabel("")
# plt.ylabel("数量")
# plt.show()

# 3.获取招聘岗位的数量
# boss_fp = boss_fp.dropna(subset=['jobCategory'])
# plt.figure(figsize=(16, 6))  # 设置图形宽度为 10 英寸，高度为 6 英寸
# boss_fp['jobCategory'] = boss_fp['jobCategory'].str.split('[, /]')  # 支持逗号、斜杠和空格作为分隔符
# df_expanded = boss_fp.explode('jobCategory')
# # 按 jobCategory 列进行分组，并统计每个组的大小
# category_counts = df_expanded.groupby('jobCategory').size().reset_index(name='job_count').sort_values('job_count', ascending=False)
# categories = category_counts['jobCategory'].tolist()
# values = category_counts['job_count'].tolist()
# translated_data = [dataCleaning.job_keywords_cn.get(item, item) for item in categories]
# plt.bar(translated_data, values)
# # 添加标题和标签
# plt.title("招聘岗位的数量  ")
# plt.xlabel("")
# plt.ylabel("数量")
# plt.show()

# 4.获取每个职业的最高和最低工资的中位数
# plt.figure(figsize=(16, 6))
# boss_fp['jobCategory'] = boss_fp['jobCategory'].str.split('[, /]')
# df_expanded = boss_fp.explode('jobCategory')
# print(df_expanded[['jobCategory']])
# 进行分组，并计算每个组的最低工资和最高工资的中位数
# min_result = boss_fp.groupby('city_name')['min_salary'].mean()
# max_result = boss_fp.groupby('city_name')['max_salary'].mean()
# # 将结果转换为字典格式
# jobCategoryName = list(min_result.index)
# jobCategoryName = [dataCleaning.job_keywords_cn.get(item, item) for item in jobCategoryName]
# minValues = min_result.tolist()  # 转换 Series 数据为列表
# maxValues = max_result.tolist()  # 转换 Series 数据为列表
# # 设置条形宽度
# bar_width = 0.35
# # 设置x轴位置
# index = np.arange(len(jobCategoryName))
# # 绘制两组柱状图
# plt.bar(index - bar_width/2, minValues, bar_width, label='下限平均数')
# plt.bar(index + bar_width/2, maxValues, bar_width, label='上限平均数')
# # 添加标题和标签
# plt.title('各城市薪资平均数')
# plt.xlabel('城市')
# plt.ylabel('薪资')
# # 设置x轴刻度
# plt.xticks(index, jobCategoryName)
# # 添加图例
# plt.legend()
# # 显示图形
# plt.show()

# # 5.饼图 公司规模
# count_result = boss_fp.groupby('brand_scale_name').size().reset_index(name='job_count')
# # 绘制饼图
# plt.figure(figsize=(8, 8))  # 可选：设置图形的大小
# plt.pie(count_result['job_count'], labels=count_result['brand_scale_name'], autopct='%1.1f%%',
#         startangle=140, colors=['#ff9999','#66b3ff','#99ff99','#ffcc99','#c2c2f0','#ffb3e6'])
# # 添加标题
# plt.title('公司规模的岗位数量分布')
# # 显示图形
# plt.show()

# 6.饼图 工龄分布
# df = boss_fp.groupbyupby('job_experience').size().reset_index(name='job_count')
# desired_order = ['经验不限', '在校/应届', '1年以内', '1-3年','3-5年', '5-10年', '10年以上']
# df['job_experience'] = pd.Categorical(df['job_experience'], categories=desired_order, ordered=True)
# df = df.sort_values('job_experience')  # 按照自定义顺序排序
# # 使用分散的颜色方案
# colors = cm.Set3.colors  # 使用 Set3 调色板
# # 绘制饼图
# plt.figure(figsize=(8, 8))
# plt.pie(df['job_count'],
#         labels=df['job_experience'],
#         startangle=140,
#         colors=colors[:len(df)],
#         textprops={'fontsize': 10},
#         autopct='%1.1f%%')  # 调整字体大小
# # 添加标题
# plt.title('工作经验分布')
# # 显示图形
# plt.show()

# 7.饼图 学历要求
# boss_fp['job_degree'] = boss_fp['job_degree'].replace('高中', '高中及以下').replace('高中', '高中及以下').replace('中专/中技', '高中及以下')
# df = boss_fp.groupby('job_degree').size().reset_index(name='job_count')
# print(df['job_degree'])
# desired_order = ['学历不限', '高中及以下', '大专', '本科', '硕士', '博士']
# df['job_degree'] = pd.Categorical(df['job_degree'], categories=desired_order, ordered=True)
# df = df.sort_values('job_degree')  # 按照自定义顺序排序
# # 使用分散的颜色方案
# colors = cm.Set3.colors  # 使用 Set3 调色板
# # 绘制饼图
# plt.figure(figsize=(10, 8))
# wedges, texts, autotexts = plt.pie(
#     df['job_count'],
#     labels=df['job_degree'],
#     autopct='%1.1f%%',
#     startangle=140,
#     colors=colors[:len(df)],
#     labeldistance=1.2,  # 标签距离中心的距离
#     pctdistance=0.85,  # 百分比数字距离扇区中心的距离
#     textprops={'fontsize': 10},  # 调整字体大小
#     wedgeprops={'width': 0.4}  # 使用环形饼图
# )
# # # 添加标题
# plt.title('学历要求分布')
# # 显示图形
# plt.show()

# 8.获取线图 热门编程语言各个学历招聘岗位数量
# df_exploded = boss_fp.explode('jobCategory')
# # 筛选 jobCategory 只包含 'Java', 'Python', 'C' 的数据
# df_filtered = df_exploded[df_exploded['jobCategory'].isin(['Python', 'Java', 'CAndC++','Frontend'])]
# # 按 jobCategory 和 job_degree 分组，统计每个 job_degree 的个数
# result = df_filtered.groupby(['jobCategory', 'job_degree']).size().reset_index(name='count')
# # 自定义学历顺序
# degree_order = ['学历不限', '大专', '本科', '硕士', '博士']
# # 将 job_degree 按照自定义顺序排序
# result['job_degree'] = pd.Categorical(result['job_degree'], categories=degree_order, ordered=True)
# result = result.sort_values(by=['jobCategory', 'job_degree'])
# # 将 'CAndC++' 改名为 'C/C++'
# result['jobCategory'] = result['jobCategory'].replace('CAndC++', 'C/C++').replace('Frontend', '前端')
# # 去除 NaN 行
# result = result.dropna()
# # 按学历排序
# df = result.sort_values('job_degree')
# # 绘制折线图
# plt.figure(figsize=(10, 6))
# # 按 jobCategory 分组并绘制
# for category, group in df.groupby('jobCategory'):
#     plt.plot(group['job_degree'], group['count'], marker='o', label=category)
# # 添加标题和标签
# plt.title('热门编程语言各个学历招聘岗位数量', fontsize=16)
# plt.xlabel('学历', fontsize=12)
# plt.ylabel('数量', fontsize=12)
# # 添加网格线
# plt.grid(alpha=0.5)
# # 显示图例
# plt.legend(title='编程语言')
# # 显示图形
# plt.show()
#


# # 技能云词
# all_skills = []
# for skills in boss_fp['skills']:
#     # 确保数据是字符串类型，并处理空值
#     if isinstance(skills, str):
#         all_skills.extend([skill.strip() for skill in skills.split(',')])
#     else:
#         # 如果是 NaN 或其他非字符串数据，跳过
#         continue
# # 统计词频
# word_counts = Counter(all_skills)
#
# # 获取按降序排列的统计结果
# sorted_word_counts = word_counts.most_common()
#
# # 打印排序后的结果
# for word, count in sorted_word_counts:
#     print(f"{word}: {count}")
#
# # 去掉重复的词汇
# unique_words = set(all_skills)
# # 将去重后的词汇重新组合成一个字符串，词之间以空格分隔
# words = " ".join(unique_words)
# # 创建一个 WordCloud 对象，设置配色方案
# wordcloud = WordCloud(
#     font_path="/System/Library/Fonts/STHeiti Light.ttc",  # macOS 上的字体路径
#     width=800,      # 云词图的宽度
#     height=600,     # 云词图的高度
#     background_color="white",  # 背景颜色
#     max_font_size=100,  # 限制最大字体大小
#     max_words=100,  # 最大显示单词数
#     colormap='tab10',  # 配色方案
#     random_state=42  # 确保每次生成的云词图一致
# ).generate(words)
# # 显示生成的云词图
# plt.imshow(wordcloud, interpolation='bilinear')
# plt.axis('off')  # 不显示坐标轴
# plt.show()


